共计 3980 个字符,预计需要花费 10 分钟才能阅读完成。
引入
在公司工作普通用户权限不够, 需要使用管理员权限的时候通常有两种解决方案
1.su 切换用户身份
-
特点: 使用普通用户身份登入, 然后使用 su 命令切换到 root 用户
-
优点: 简单
- 缺点: 需要知道 root 密码, 并且获得了所有 root 权限, 不安全
2.sudo 提权
-
特点: 使用普通用户身份登入, sudo 命令获得 root 用户的部分管理权限(管理员设置好的)
-
优点: 1. 不需要切换到 root 用户下,
2. 不需要知道 root 密码, 输入的是自己的密码, 提升了安全性
3. 权限控住更为精确, 可以控制普通用户之获取 root 用户部分权限
- 缺点: 设置相对比较复杂
一.su 切换用户
1.su 命令和选项
su [用户名]
: 切换用户身份, 不切换环境, 切到 root 直接 su, 需要密码,root 切到其他不需要su - [用户名]
: 切换用户并切换用户环境su [用户名] -c [命令]
:临时使用某个用户身份执行命令
2.BashShell 配置文件介绍
- 全局配置文件
/etc/profile #类文件, 设定环境变量, 登入前运行的脚本和命令
/etc/profile.d/*.sh #可执行的脚本文件
/etc/bashrc #类文件, 设定本地变量, 定义命令别名
- 个人配置文件
~/.bash_profile #类文件, 设定环境变量, 登入前运行的脚本和命令
~/.bashrc #类文件, 设定本地变量, 定义命令别名
- 如果全局变量与个人个人变量冲突, 以 个人配置为准
- 验证配置加载 : 使用 echo 在每个文件添加一行输出, 注意放在文件的第一行
2. 登入式 shell
-
需要输入用户名和密码才能进入的 shell, 日常接触最多的一种
-
执行登入式 shell : 身份与环境都切换
命令 : su - [用户名]
- 加载配置文件的应用顺序
1. 👉 /etc/profile
2. 👉 /etc/profile.d/*.sh
3. 👉 ~/.bash_profile
4. 👉 ~/.bashrc
5. 👉 /etc/bashrc
3. 非登入式 shell
- 不需要输入用户名和密码就能进入 shell, 比如运行 bash 会开启一个新的会话窗口
- 执行非登入式 shell : 只切换用户身份, 不切换环境
命令 : su [用户名]
- 加载配置文件的应用顺序
1. 👉 ~/.bashrc
2. 👉 /etc/bashrc
3. 👉 /etc/profile.d/*.sh
4. 补充知识点
- Shell 的使用方式有两种
1. 交互式 shell : 等待用户输入执行的命令(终端操作, 需要不断地提醒)
2. 非交互式 Shell : 执行 Shell 脚本, 脚本执行结束后 Shell 自动退出
- 用户切换补充
1. 从 root 切到普通用户无需密码, 反过来需要
2. 临时切换身份执行命令 : su - [用户名] -c "[命令]"
二.sudo 提权
1. 使用 root 用户修改配置文件两种方式
-
visudo (推荐)
[root@shawn ~]# visudo
[root@shawn ~]# visudo -c #检查配置是否正确
/etc/sudoers:解析正确
-
vim /etc/sudoers
不会检查配置是否正确
会高亮显示语法
使用 sudo 操作会被记录到管理员邮箱 "/var/spool/mail/root"
2.sudo 命令和选项
sudo –i –u [用户名]
切换身份为某某用户sudo -u [用户名]
使用指定的用户执行命令(一般是在 root 用户下)sudo -l
列出用户在主机上可用的和被禁止的命令sudo -v
再延长密码有效期限 5 分钟, 更新时间戳(密码 5 分钟有效)sudo -k
清除时间戳, 下次需要重新输密码
3. 授权规则格式
-
格式
user host=(runas) command
[用户] [主机 IP 或主机名]=[转成的用户身份] [命令]
示例: root ALL=(ALL) ALL
-
格式说明
-
user
: 运行者的身份
python
1.👉 username : 直接写用户名
2.👉 #UID : 使用用户的 uid
2.👉 %group_name : 使用一个组
3.👉 %#gid : 使用组 ID
4.👉 User_Alise : 使用用户别名, 跟组一样在里面加入多个用户
host
: 允许哪些用户使用哪些主机
python
1.👉 ip 地址 : 比如 192.168.12.179
2.👉 hostname : 直接使用主机名
3.👉 network : 网段
4.👉 Host_Alias : 主机别名
(runas)
: 使用哪个用户身份运行, 一般是(root)
python
1.👉 username : 用户名
2.👉 #uid : uid
3.👉 %group_name : 组名
4.👉 %#gid : gid
4.👉 Runaas_Alias : 别名
command
: 运行哪些命令
python
1.👉 command name : 命令的绝对路径
2.👉 directory : 一个目录, 代表目录下的命令都可用
3.👉 sudoedit : 编辑 "sudoers" 文件, 授权用户可以自定义权限
4.👉 Cmnd_Alias : 命令别名, 里面都得是绝对路径, 用逗号分隔
- 补充
python
1.👉 命令必须使用绝对路径: 比如 "/usr/bin/vim /etc/shadow"
2.👉 别名必须大写: 比如 "USER=song1,song2","IP=192.x.x.x,192.x.x.x"
3.👉 执行命令不需要密码设置: "NOPASSWD:command","NOPASSWD:Cmnd_Alias"
4. 示例
- 用户 "song1" 可以使用命令别名 "MND" 里的命令
- 命令别名 "MND" 包含了 "cat /etc/shadow" 命令
⛅设置命令别名, 里面包含命令, 多个命令用逗号隔开
[root@shawn ~]# visudo
Cmnd_Alias CMND = /bin/cat /etc/shadow
⛅设置用户 "song1" 可使用, 并无需输入密码
song1 ALL=(root) NOPASSWD:MND
⛅验证
[root@shawn ~]# su - song1
上一次登录:六 10 月 31 16:34:20 CST 2020pts/0 上
[song1@shawn ~]$ cat /etc/shadow #未提权
cat: /etc/shadow: 权限不够
[song1@shawn ~]$ sudo cat /etc/shadow #提权
root:$6$TRKWGiXlX063z/6A$fTzd6HMfLMtdfXFm0::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
..............
........
...
- 用户别名 "ADMINS" 里的用户可以使用 "ifconfig" 修改网卡配置
- 用户别名 "ADMINS" 包含了用户 "song1" 和"song2"
⛅设置用户别名, 里面包含 "song1","song2"
User_Alias ADMINS = song1, song2
⛅设置别名可使用网卡配置命令
ADMINS ALL=(root) /usr/sbin/ifconifg
⛅验证 "song1"
[root@shawn ~]# su - song1
[song1@shawn ~]$ ifconfig ens32:0 2.2.2.2 #未提权
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
[song1@shawn ~]$ sudo ifconfig ens32:0 2.2.2.2 #提权
[sudo] song1 的密码:#输入密码
[song1@shawn ~]$ ifconfig
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 2.2.2.2 netmask 255.0.0.0 broadcast 2.255.255.255
ether 00:0c:29:3e:45:6a txqueuelen 1000 (Ethernet)
⛅验证 "song2"
[root@shawn song1]# su - song2
上一次登录:五 10 月 30 19:32:23 CST 2020pts/1 上
[song2@shawn ~]$ ifconfig ens32:2 4.4.4.4 #未提权
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
[song2@shawn ~]$ sudo ifconfig ens32:2 4.4.4.4 #提权
我们信任您已经从系统管理员那里了解了日常注意事项。总结起来无外乎这三点:#1) 尊重别人的隐私。#2) 输入前要先考虑(后果和风险)。#3) 权力越大,责任越大。[sudo] song2 的密码:#输入密码
[song2@shawn ~]$ ifconfig
ens32:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 4.4.4.4 netmask 255.0.0.0 broadcast 4.255.255.255
ether 00:0c:29:3e:45:6a txqueuelen 1000 (Ethernet)
- 用户 "song3" 可以使用 "root" 的所有权限, 但唯独不能 "userdel" 删除用户
⛅设置 "song3" 的配置
song3 ALL=(ALL) NOPASSWD:ALL,!/usr/sbin/userdel
⛅验证
[root@shawn ~]# su - song3
上一次登录:六 10 月 31 17:09:41 CST 2020pts/0 上
[song3@shawn ~]$ useradd aaaa #未提权
-bash: /usr/sbin/useradd: 权限不够
[song3@shawn ~]$ sudo useradd aaaa #提权
[song3@shawn ~]$ id aaaa
\uid=1004(aaaa) gid=1005(aaaa) 组 =1005(aaaa)
[song3@shawn ~]$ sudo userdel aaaa #无法删除用户
对不起,用户 song3 无权以 root 的身份在 shawn 上执行 /sbin/userdel aaaa。